home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / DEMOS / opengl_logo / DEF_LOGO.C next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  15.9 KB  |  623 lines

  1. /*
  2.  * Def_logo.c
  3.  *
  4.  * This file is part of the openGL-logo demo.
  5.  * (c) Henk Kok (kok@wins.uva.nl)
  6.  *
  7.  * Copying, redistributing, etc is permitted as long as this copyright
  8.  * notice and the Dutch variable names :) stay in tact.
  9.  */
  10.  
  11. #include <stdlib.h>
  12. #include <GL/glut.h>
  13. #include <math.h>
  14.  
  15. /* some math.h's don't define M_PI */
  16. #ifndef M_PI
  17. #define M_PI 3.14159265359
  18. #endif
  19.  
  20. #define ACC 8
  21. #define ACC2 16
  22. #define ACC3 48
  23. #define ACC4 24
  24. #define THLD 0.6
  25. #define THLD2 0.8
  26.  
  27. extern int angle, rotating;
  28. extern float progress;
  29.  
  30. GLfloat TRANS[7][3];
  31. GLfloat ROTAXIS[7][3];
  32. GLfloat ROT[7];
  33.  
  34. GLfloat char_El[ACC3+1][ACC][3];
  35. GLfloat normal_El[ACC3+1][ACC][3];
  36.  
  37. GLfloat char_O[ACC4][ACC][3];
  38. GLfloat normal_O[ACC4][ACC][3];
  39.  
  40. GLfloat char_P[ACC2][ACC][3];
  41. GLfloat normal_P[ACC2][ACC][3];
  42.  
  43. GLfloat char_G[ACC4][ACC][3];
  44. GLfloat normal_G[ACC4][ACC][3];
  45.  
  46. GLfloat accSIN[ACC], accCOS[ACC];
  47.  
  48. GLfloat difmat4[4] = { 0.425, 0.570, 0.664, 1.0 };
  49. GLfloat difamb4[4] = { 0.425, 0.570, 0.664, 1.0 };
  50. GLfloat matspec4[4] = { 0.174, 0.174, 0.174, 1.0 };
  51.  
  52. int rnd(int i)
  53. {
  54.     return rand()%i;
  55. }
  56.  
  57. void groen_texture(void)
  58. {
  59.     glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat4);
  60.     glMaterialfv(GL_FRONT, GL_AMBIENT, difamb4);
  61.     glMaterialfv(GL_FRONT, GL_SPECULAR, matspec4);
  62.     glMaterialf(GL_FRONT, GL_SHININESS, 35.0);
  63. }
  64.  
  65. void def_O(void)
  66. {
  67.     float a, s, c, ln;
  68.     int i,j,k,l,m,n;
  69.     float dx, dy;
  70.     float dx1, dx2, dy1, dy2, dz1, dz2;
  71.     GLfloat center_O[ACC4+4][3];
  72.     GLfloat width_O[ACC4+4];
  73.     for (i=0;i<ACC4;i++)
  74.     {
  75.         a = 2.0*((float) i)*M_PI/ACC4;
  76.         s = 1+sin(a);
  77.         c = cos(a);
  78.         center_O[i][0] = c*3.8;
  79.         center_O[i][1] = s*3.8+(s<-1.01?-0.8:(s>1.01?0.8:0)) + 0.8;
  80.         center_O[i][2] = 0.0;
  81.         width_O[i] = 0.6;
  82.     }
  83. /* I should be able to generalise this. oh well */
  84.     for (i=0;i<ACC4;i++)
  85.     {
  86.         j = (i+1)%ACC4;
  87.         k = (i+ACC4-1)%ACC4;
  88.         for (a=0;a<ACC;a++)
  89.         {
  90.             c = cos(a*M_PI*2.0/ACC);
  91.             s = sin(a*M_PI*2.0/ACC);
  92.             dx = center_O[j][0] - center_O[k][0];
  93.             dy = center_O[j][1] - center_O[k][1];
  94.             ln = sqrt(dx*dx+dy*dy);
  95.             dx = dx/ln;
  96.             dy = dy/ln;
  97.             char_O[i][(int) a][0] = center_O[i][0] + width_O[i] * dy * c;
  98.             char_O[i][(int) a][1] = center_O[i][1] - width_O[i] * dx * c;
  99.             char_O[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
  100.         }
  101.     }
  102.     for (i=0;i<ACC;i++)
  103.     {
  104.         j = (i+1)%ACC;
  105.         k = (i-1+ACC)%ACC;
  106.         for (l=0;l<ACC4;l++)
  107.         {
  108.             m = (l+1)%ACC4;
  109.             n = (l+ACC4-1)%ACC4;
  110.             dx1 = char_O[m][i][0] - char_O[n][i][0];
  111.             dy1 = char_O[m][i][1] - char_O[n][i][1];
  112.             dz1 = char_O[m][i][2] - char_O[n][i][2];
  113.             dx2 = char_O[l][k][0] - char_O[l][j][0];
  114.             dy2 = char_O[l][k][1] - char_O[l][j][1];
  115.             dz2 = char_O[l][k][2] - char_O[l][j][2];
  116.             normal_O[l][i][0] = dy2*dz1 - dy1*dz2;
  117.             normal_O[l][i][1] = dz2*dx1 - dz1*dx2;
  118.             normal_O[l][i][2] = dx2*dy1 - dx1*dy2;
  119.         }
  120.     }
  121. }
  122.  
  123. void def_P(void)
  124. {
  125.     float a, s, c, ln;
  126.     int i,j,k,l,m,n;
  127.     float dx, dy;
  128.     float dx1, dx2, dy1, dy2, dz1, dz2;
  129.     GLfloat center_P[ACC2][3];
  130.     GLfloat width_P[ACC2];
  131.     for (i=0;i<ACC2;i++)
  132.     {
  133.         a = 2.0*((float) i)*M_PI/ACC2;
  134.         s = 1+sin(a);
  135.         c = cos(a);
  136.         center_P[i][0] = c*2.15;
  137.         center_P[i][1] = s*2.1 + (s<-1.01?-0.7:(s>1.01?0.7:0)) + 0.7;
  138.         center_P[i][2] = 0.0;
  139.         width_P[i] = 0.5;
  140.     }
  141.  
  142.     for (i=0;i<ACC2;i++)
  143.     {
  144.         j = (i+1)%ACC2;
  145.         k = (i+ACC2-1)%ACC2;
  146.         for (a=0;a<ACC;a++)
  147.         {
  148.             accCOS[(int) a] = c = cos(a*M_PI*2.0/ACC);
  149.             accSIN[(int) a] = s = sin(a*M_PI*2.0/ACC);
  150.             dx = center_P[j][0] - center_P[k][0];
  151.             dy = center_P[j][1] - center_P[k][1];
  152.             ln = sqrt(dx*dx+dy*dy);
  153.             dx = dx/ln;
  154.             dy = dy/ln;
  155.             char_P[i][(int) a][0] = center_P[i][0] + width_P[i] * dy * c;
  156.             char_P[i][(int) a][1] = center_P[i][1] - width_P[i] * dx * c;
  157.             char_P[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
  158.         }
  159.     }
  160.     for (i=0;i<ACC;i++)
  161.     {
  162.         j = (i+1)%ACC;
  163.         k = (i-1+ACC)%ACC;
  164.         for (l=0;l<ACC2;l++)
  165.         {
  166.             m = (l+1)%ACC2;
  167.             n = (l+ACC2-1)%ACC2;
  168.             dx1 = char_P[m][i][0] - char_P[n][i][0];
  169.             dy1 = char_P[m][i][1] - char_P[n][i][1];
  170.             dz1 = char_P[m][i][2] - char_P[n][i][2];
  171.             dx2 = char_P[l][k][0] - char_P[l][j][0];
  172.             dy2 = char_P[l][k][1] - char_P[l][j][1];
  173.             dz2 = char_P[l][k][2] - char_P[l][j][2];
  174.             normal_P[l][i][0] = dy2*dz1 - dy1*dz2;
  175.             normal_P[l][i][1] = dz2*dx1 - dz1*dx2;
  176.             normal_P[l][i][2] = dx2*dy1 - dx1*dy2;
  177.         }
  178.     }
  179. }
  180.  
  181. void def_El(void)
  182. {
  183.     float a, s, c, ln;
  184.     int i,j,k,l,m,n;
  185.     float dx, dy;
  186.     float dx1, dx2, dy1, dy2, dz1, dz2;
  187.     GLfloat center_El[ACC3+3][3];
  188.     GLfloat width_El[ACC3+3];
  189.     for (i=0;i<ACC3+1;i++)
  190.     {
  191.         /* a = (ACC3/24 + i*11/12)*M_PI*2.0/ACC3; */
  192.         a = (ACC3/8 + ((float) i)*3/4)*M_PI*2.0/ACC3;
  193.         s = 1+sin(a);
  194.         c = cos(a);
  195.         center_El[i][0] = c*18.0;
  196.         center_El[i][1] = s*9.3;
  197.         center_El[i][2] = 0.0;
  198.         width_El[i] = pow(3.5, sin(i*M_PI/ACC3))-0.6;
  199.     }
  200.  
  201.     for (i=0;i<ACC3+1;i++)
  202.     {
  203.         j = (i+1)%ACC3;
  204.         k = (i+ACC3-1)%ACC3;
  205.         for (a=0;a<ACC;a++)
  206.         {
  207.             c = cos(a*M_PI*2.0/ACC);
  208.             s = sin(a*M_PI*2.0/ACC);
  209.             dx = center_El[j][0] - center_El[k][0];
  210.             dy = center_El[j][1] - center_El[k][1];
  211.             ln = sqrt(dx*dx+dy*dy);
  212.             dx = dx/ln;
  213.             dy = dy/ln;
  214.             char_El[i][(int) a][0] = center_El[i][0] + width_El[i] * dy * c;
  215.             char_El[i][(int) a][1] = center_El[i][1] - width_El[i] * dx * c;
  216.             char_El[i][(int) a][2] = (s<-THLD2?-THLD2:(s>THLD2?THLD2:s));
  217.         }
  218.     }
  219.     for (i=0;i<ACC+1;i++)
  220.     {
  221.         j = (i+1)%ACC;
  222.         k = (i-1+ACC)%ACC;
  223.         for (l=0;l<ACC3;l++)
  224.         {
  225.             m = (l+1)%ACC3;
  226.             n = (l+ACC3-1)%ACC3;
  227.             dx1 = char_El[m][i][0] - char_El[n][i][0];
  228.             dy1 = char_El[m][i][1] - char_El[n][i][1];
  229.             dz1 = char_El[m][i][2] - char_El[n][i][2];
  230.             dx2 = char_El[l][k][0] - char_El[l][j][0];
  231.             dy2 = char_El[l][k][1] - char_El[l][j][1];
  232.             dz2 = char_El[l][k][2] - char_El[l][j][2];
  233.             normal_El[l][i][0] = dy2*dz1 - dy1*dz2;
  234.             normal_El[l][i][1] = dz2*dx1 - dz1*dx2;
  235.             normal_El[l][i][2] = dx2*dy1 - dx1*dy2;
  236.         }
  237.     }
  238. }
  239.  
  240. void def_G(void)
  241. {
  242.     float a, s, c, ln;
  243.     int i,j,k,l,m,n;
  244.     float dx, dy;
  245.     float dx1, dx2, dy1, dy2, dz1, dz2;
  246.     GLfloat center_G[ACC4][3];
  247.     GLfloat width_G[ACC4];
  248.     for (i=0;i<ACC4;i++)
  249.     {
  250.         a = 2.0*((float) i)*M_PI/ACC4;
  251.         s = 1+sin(a);
  252.         c = cos(a);
  253.         center_G[i][0] = c*3.8;
  254.         center_G[i][1] = s*3.8+(s<-1.01?-0.8:(s>1.01?0.8:0)) + 0.8;
  255.         center_G[i][2] = 0.0;
  256.         width_G[i] = 0.9;
  257.         if (i>ACC4*3/4)
  258.             width_G[i] = 0.9 - ((i-ACC4*3/4)*0.9)/ACC;
  259.     }
  260.     for (i=0;i<ACC4;i++)
  261.     {
  262.         j = (i+1)%ACC4;
  263.         k = (i+ACC4-1)%ACC4;
  264.         for (a=0;a<ACC;a++)
  265.         {
  266.             c = cos(a*M_PI*2.0/ACC);
  267.             s = sin(a*M_PI*2.0/ACC);
  268.             dx = center_G[j][0] - center_G[k][0];
  269.             dy = center_G[j][1] - center_G[k][1];
  270.             ln = sqrt(dx*dx+dy*dy);
  271.             dx = dx/ln;
  272.             dy = dy/ln;
  273.             char_G[i][(int) a][0] = center_G[i][0] + width_G[i] * dy * c;
  274.             char_G[i][(int) a][1] = center_G[i][1] - width_G[i] * dx * c;
  275.             char_G[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
  276.         }
  277.     }
  278.     for (i=0;i<ACC;i++)
  279.     {
  280.         j = (i+1)%ACC;
  281.         k = (i-1+ACC)%ACC;
  282.         for (l=0;l<ACC4;l++)
  283.         {
  284.             m = (l+1)%ACC4;
  285.             n = (l+ACC4-1)%ACC4;
  286.             dx1 = char_G[m][i][0] - char_G[n][i][0];
  287.             dy1 = char_G[m][i][1] - char_G[n][i][1];
  288.             dz1 = char_G[m][i][2] - char_G[n][i][2];
  289.             dx2 = char_G[l][k][0] - char_G[l][j][0];
  290.             dy2 = char_G[l][k][1] - char_G[l][j][1];
  291.             dz2 = char_G[l][k][2] - char_G[l][j][2];
  292.             normal_G[l][i][0] = dy2*dz1 - dy1*dz2;
  293.             normal_G[l][i][1] = dz2*dx1 - dz1*dx2;
  294.             normal_G[l][i][2] = dx2*dy1 - dx1*dy2;
  295.         }
  296.     }
  297. }
  298.  
  299. void randomize(void)
  300. {
  301.     int i;
  302.     for (i=0;i<7;i++)
  303.     {
  304.         TRANS[i][0] = rnd(100)-rnd(100);
  305.         TRANS[i][1] = rnd(100)-rnd(100);
  306.         TRANS[i][1] = rnd(100)-rnd(100);
  307.         ROTAXIS[i][0] = rnd(100)-rnd(100);
  308.         ROTAXIS[i][1] = rnd(100)-rnd(100);
  309.         ROTAXIS[i][1] = rnd(100)-rnd(100);
  310.         ROT[i]=rnd(3600)-rnd(3600);
  311.     }
  312. }
  313.  
  314. void def_logo(void)
  315. {
  316.     def_O();
  317.     def_P();
  318.     def_El();
  319.     def_G();
  320. }
  321.  
  322. void draw_O(void)
  323. {
  324.     int i,j,k;
  325.     for (i=0;i<ACC;i++)
  326.     {
  327.         k = i+1;
  328.         if (k>=ACC)
  329.             k = 0;
  330.         glBegin(GL_QUAD_STRIP);
  331.         for (j=0;j<ACC4;j++)
  332.         {
  333.             glNormal3f(normal_O[j][k][0], normal_O[j][k][1], normal_O[j][k][2]);
  334.             glVertex3f(char_O[j][k][0], char_O[j][k][1], char_O[j][k][2]);
  335.             glNormal3f(normal_O[j][i][0], normal_O[j][i][1], normal_O[j][i][2]);
  336.             glVertex3f(char_O[j][i][0], char_O[j][i][1], char_O[j][i][2]);
  337.         }
  338.         glNormal3f(normal_O[0][k][0], normal_O[0][k][1], normal_O[0][k][2]);
  339.         glVertex3f(char_O[0][k][0], char_O[0][k][1], char_O[0][k][2]);
  340.         glNormal3f(normal_O[0][i][0], normal_O[0][i][1], normal_O[0][i][2]);
  341.         glVertex3f(char_O[0][i][0], char_O[0][i][1], char_O[0][i][2]);
  342.         glEnd();
  343.     }
  344. }
  345.  
  346. void draw_P(void)
  347. {
  348.     int i,j,k;
  349.     for (i=0;i<ACC;i++)
  350.     {
  351.         k = i+1;
  352.         if (k>=ACC)
  353.             k = 0;
  354.         glBegin(GL_QUAD_STRIP);
  355.         for (j=0;j<ACC2;j++)
  356.         {
  357.             glNormal3f(normal_P[j][k][0], normal_P[j][k][1], normal_P[j][k][2]);
  358.             glVertex3f(char_P[j][k][0], char_P[j][k][1], char_P[j][k][2]);
  359.             glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
  360.             glVertex3f(char_P[j][i][0], char_P[j][i][1], char_P[j][i][2]);
  361.         }
  362.         glNormal3f(normal_P[0][k][0], normal_P[0][k][1], normal_P[0][k][2]);
  363.         glVertex3f(char_P[0][k][0], char_P[0][k][1], char_P[0][k][2]);
  364.         glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
  365.         glVertex3f(char_P[0][i][0], char_P[0][i][1], char_P[0][i][2]);
  366.         glEnd();
  367.     }
  368.     j = 0;
  369.     glBegin(GL_QUAD_STRIP);
  370.     for (i=0;i<ACC;i++)
  371.     {
  372.         glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
  373.         glVertex3f(char_P[0][i][0]-4.3, -1.6, 1.0*char_P[0][i][2]);
  374.         glVertex3f(char_P[0][i][0]-4.3, 6.0, 1.0*char_P[0][i][2]);
  375.     }
  376.     glNormal3f(normal_P[0][0][0], normal_P[0][0][1], normal_P[0][0][2]);
  377.     glVertex3f(char_P[0][0][0]-4.3, -1.6, 1.0*char_P[0][0][2]);
  378.     glVertex3f(char_P[0][0][0]-4.3, 6.0, 1.0*char_P[0][0][2]);
  379.     glEnd();
  380. }
  381.  
  382. void draw_E(void)
  383. {
  384.     int i,j,k;
  385.     for (i=0;i<ACC;i++)
  386.     {
  387.         k = i+1;
  388.         if (k>=ACC)
  389.             k = 0;
  390.         glBegin(GL_QUAD_STRIP);
  391.         glNormal3f(normal_P[0][k][0], normal_P[0][k][1], normal_P[0][k][2]);
  392.         glVertex3f(char_P[0][k][0], char_P[0][k][1]+0.0, char_P[0][k][2]);
  393.         glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
  394.         glVertex3f(char_P[0][i][0], char_P[0][i][1]+0.0, char_P[0][i][2]);
  395.         for (j=1;j<ACC2;j++)
  396.         {
  397.             glNormal3f(normal_P[j][k][0], normal_P[j][k][1], normal_P[j][k][2]);
  398.             glVertex3f(char_P[j][k][0], char_P[j][k][1], char_P[j][k][2]);
  399.             glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
  400.             glVertex3f(char_P[j][i][0], char_P[j][i][1], char_P[j][i][2]);
  401.         }
  402.         glNormal3f(normal_P[0][k][0], normal_P[0][k][1], normal_P[0][k][2]);
  403.         glVertex3f(char_P[0][k][0], char_P[0][k][1]-0.4, char_P[0][k][2]);
  404.         glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
  405.         glVertex3f(char_P[0][i][0], char_P[0][i][1]-0.4, char_P[0][i][2]);
  406.         glEnd();
  407.     }
  408.  
  409.     glBegin(GL_QUAD_STRIP);
  410.     j = ACC2*3/4;
  411.     for (i=0;i<ACC;i++)
  412.     {
  413.         glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
  414.         glVertex3f(-2.0, char_P[j][i][1]+2.55, 1.0*char_P[j][i][2]);
  415.         glVertex3f(2.0,  char_P[j][i][1]+2.55, 1.0*char_P[j][i][2]);
  416.     }
  417.     glNormal3f(normal_P[j][0][0], normal_P[j][0][1], normal_P[j][0][2]);
  418.     glVertex3f(-2.0, char_P[j][0][1]+2.55, 1.0*char_P[j][0][2]);
  419.     glVertex3f(2.0,  char_P[j][0][1]+2.55, 1.0*char_P[j][0][2]);
  420.     glEnd();
  421. }
  422.  
  423. void draw_El(void)
  424. {
  425.     int i,j,k;
  426.     for (i=0;i<ACC;i++)
  427.     {
  428.         k = i+1;
  429.         if (k>=ACC)
  430.             k = 0;
  431.         glBegin(GL_QUAD_STRIP);
  432.         for (j=0;j<=ACC3;j++)
  433.         {
  434.             glNormal3f(normal_El[j][k][0], normal_El[j][k][1], normal_El[j][k][2]);
  435.             glVertex3f(char_El[j][k][0], char_El[j][k][1], char_El[j][k][2]);
  436.             glNormal3f(normal_El[j][i][0], normal_El[j][i][1], normal_El[j][i][2]);
  437.             glVertex3f(char_El[j][i][0], char_El[j][i][1], char_El[j][i][2]);
  438.         }
  439.         glEnd();
  440.     }
  441. }
  442.  
  443. void draw_N(void)
  444. {
  445.     int i,j,k;
  446.     for (i=0;i<ACC;i++)
  447.     {
  448.         k = i+1;
  449.         if (k>=ACC)
  450.             k = 0;
  451.         glBegin(GL_QUAD_STRIP);
  452.         for (j=0;j<=ACC2/2;j++)
  453.         {
  454.             glNormal3f(normal_P[j][k][0], normal_P[j][k][1], normal_P[j][k][2]);
  455.             glVertex3f(char_P[j][k][0], char_P[j][k][1], char_P[j][k][2]);
  456.             glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
  457.             glVertex3f(char_P[j][i][0], char_P[j][i][1], char_P[j][i][2]);
  458.         }
  459.         glEnd();
  460.     }
  461.  
  462.     j = 0;
  463.     glBegin(GL_QUAD_STRIP);
  464.     for (i=0;i<ACC;i++)
  465.     {
  466.         glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
  467.         glVertex3f(char_P[0][i][0]-4.3, 0.2, 1.0*char_P[0][i][2]);
  468.         glVertex3f(char_P[0][i][0]-4.3, 6.0, 1.0*char_P[0][i][2]);
  469.     }
  470.     glNormal3f(normal_P[0][0][0], normal_P[0][0][1], normal_P[0][0][2]);
  471.     glVertex3f(char_P[0][0][0]-4.3, 0.2, 1.0*char_P[0][0][2]);
  472.     glVertex3f(char_P[0][0][0]-4.3, 6.0, 1.0*char_P[0][0][2]);
  473.     glEnd();
  474.     j = 0;
  475.  
  476.     glBegin(GL_QUAD_STRIP);
  477.     for (i=0;i<ACC;i++)
  478.     {
  479.         glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
  480.         glVertex3f(char_P[0][i][0], 0.2, 1.0*char_P[0][i][2]);
  481.         glVertex3f(char_P[0][i][0], 3.4, 1.0*char_P[0][i][2]);
  482.     }
  483.     glNormal3f(normal_P[0][0][0], normal_P[0][0][1], normal_P[0][0][2]);
  484.     glVertex3f(char_P[0][0][0], 0.2, 1.0*char_P[0][0][2]);
  485.     glVertex3f(char_P[0][0][0], 3.4, 1.0*char_P[0][0][2]);
  486.     glEnd();
  487. }
  488.  
  489. void draw_G(void)
  490. {
  491.     int i,j,k;
  492.     for (i=0;i<ACC;i++)
  493.     {
  494.         k = i+1;
  495.         if (k>=ACC)
  496.             k = 0;
  497.         glBegin(GL_QUAD_STRIP);
  498.         glNormal3f(normal_G[0][k][0], normal_G[0][k][1], normal_G[0][k][2]);
  499.         glVertex3f(char_G[0][k][0], char_G[0][k][1]+1.2, char_G[0][k][2]);
  500.         glNormal3f(normal_G[0][i][0], normal_G[0][i][1], normal_G[0][i][2]);
  501.         glVertex3f(char_G[0][i][0], char_G[0][i][1]+1.2, char_G[0][i][2]);
  502.         for (j=1;j<ACC4;j++)
  503.         {
  504.             glNormal3f(normal_G[j][k][0], normal_G[j][k][1], normal_G[j][k][2]);
  505.             glVertex3f(char_G[j][k][0], char_G[j][k][1], char_G[j][k][2]);
  506.             glNormal3f(normal_G[j][i][0], normal_G[j][i][1], normal_G[j][i][2]);
  507.             glVertex3f(char_G[j][i][0], char_G[j][i][1], char_G[j][i][2]);
  508.         }
  509.         glEnd();
  510.     }
  511.  
  512.     glBegin(GL_QUAD_STRIP);
  513.     j = ACC4*3/4;
  514.     for (i=0;i<ACC;i++)
  515.     {
  516.         glNormal3f(accSIN[i], 0.0, accCOS[i] );
  517.         glVertex3f(4.0+0.9*accSIN[i], 4.0+0.9*accSIN[i], 0.9*accCOS[i] );
  518.         glVertex3f(4.0+0.9*accSIN[i], 0.0, 0.9*accCOS[i]);
  519.     }
  520.     glNormal3f(accSIN[0], 0.0, accCOS[0] );
  521.     glVertex3f(4.0+0.9*accSIN[0], 4.0+0.9*accSIN[0], 0.9*accCOS[0] );
  522.     glVertex3f(4.0+0.9*accSIN[0], 0.0, 0.9*accCOS[0]);
  523.     glEnd();
  524.  
  525.     glBegin(GL_QUAD_STRIP);
  526.     j = ACC4*3/4;
  527.     for (i=0;i<ACC;i++)
  528.     {
  529.         glNormal3f(0.0, accSIN[i], accCOS[i] );
  530.         glVertex3f(4.0-0.9*accSIN[i], 4.0-0.9*accSIN[i], 0.9*accCOS[i] );
  531.         glVertex3f(0.0, 4.0-0.9*accSIN[i], 0.9*accCOS[i]);
  532.     }
  533.     glNormal3f(0.0, accSIN[0], accCOS[0] );
  534.     glVertex3f(4.0-0.9*accSIN[0], 4.0-0.9*accSIN[0], 0.9*accCOS[0] );
  535.     glVertex3f(0.0, 4.0-0.9*accSIN[0], 0.9*accCOS[0]);
  536.     glEnd();
  537.  
  538.     j = ACC4*3/4;
  539.     glBegin(GL_TRIANGLE_FAN);
  540.     glNormal3f(-1.0, 0.0, 0.0);
  541.     glVertex3f(0.0, 4.0, 0.0);
  542.     for (i=0;i<ACC;i++)
  543.         glVertex3f(0.0, 4.0+0.9*accSIN[i], 0.9*accCOS[i]);
  544.     glVertex3f(0.0, 4.0+0.9*accSIN[0], 0.9*accCOS[0]);
  545.     glEnd();
  546. }
  547.  
  548. void draw_L(void)
  549. {
  550.     int i;
  551.  
  552.     glBegin(GL_QUAD_STRIP);
  553.     for (i=0;i<ACC;i++)
  554.     {
  555.         glNormal3f(accSIN[i], 0.0, accCOS[i] );
  556.         glVertex3f(0.9*accSIN[i], 9.6, 0.9*accCOS[i]);
  557.         glVertex3f(0.9*accSIN[i], 0.9+0.9*accSIN[i], 0.9*accCOS[i] );
  558.     }
  559.     glNormal3f(accSIN[0], 0.0, accCOS[0] );
  560.     glVertex3f(0.9*accSIN[0], 9.6, 0.9*accCOS[0]);
  561.     glVertex3f(0.9*accSIN[0], 0.9+0.9*accSIN[0], 0.9*accCOS[0] );
  562.     glEnd();
  563.  
  564.     glBegin(GL_QUAD_STRIP);
  565.     for (i=0;i<ACC;i++)
  566.     {
  567.         glNormal3f(0.0, accSIN[i], accCOS[i] );
  568.         glVertex3f(0.9*accSIN[i], 0.9+0.9*accSIN[i], 0.9*accCOS[i] );
  569.         glVertex3f(5.6, 0.9+0.9*accSIN[i], 0.9*accCOS[i]);
  570.     }
  571.     glNormal3f(0.0, accSIN[0], accCOS[0] );
  572.     glVertex3f(0.9*accSIN[0], 0.9+0.9*accSIN[0], 0.9*accCOS[0] );
  573.     glVertex3f(5.6, 0.9+0.9*accSIN[0], 0.9*accCOS[0]);
  574.     glEnd();
  575.  
  576.     glBegin(GL_TRIANGLE_FAN);
  577.     glNormal3f(1.0, 0.0, 0.0);
  578.     glVertex3f(5.6, 0.9, 0.0);
  579.     for (i=ACC-1;i>=0;i--)
  580.         glVertex3f(5.6, 0.9+0.9*accSIN[i], 0.9*accCOS[i]);
  581.     glVertex3f(5.6, 0.9+0.9*accSIN[ACC-1], 0.9*accCOS[ACC-1]);
  582.     glEnd();
  583. }
  584.  
  585. void draw_part(int i)
  586. {
  587.     glPushMatrix();
  588.     glTranslatef(TRANS[i][0]*progress, TRANS[i][1]*progress, TRANS[i][2]*progress);
  589.     glRotatef(ROT[i]*progress, ROTAXIS[i][0], ROTAXIS[i][1], ROTAXIS[i][2]);
  590.     switch(i)
  591.     {
  592.     case 0: draw_El(); break;
  593.     case 1: draw_O(); break;
  594.     case 2: draw_P(); break;
  595.     case 3: draw_E(); break;
  596.     case 4: draw_N(); break;
  597.     case 5: draw_G(); break;
  598.     case 6: draw_L(); break;
  599.     }
  600.     glPopMatrix();
  601. }
  602.  
  603. void draw_logo(void)
  604. {
  605.     groen_texture();
  606.     glEnable(GL_CULL_FACE);
  607.     glTranslatef(-2.8, 0.0, 0.0);
  608.  
  609.     draw_part(0);
  610.     glTranslatef(-12.0, 4.3, 0.0);
  611.     draw_part(1);
  612.     glTranslatef(7.3, 0.0, 0.0);
  613.     draw_part(2);
  614.     glTranslatef(5.4, 0.0, 0.0);
  615.     draw_part(3);
  616.     glTranslatef(5.4, 0.0, 0.0);
  617.     draw_part(4);
  618.     glTranslatef(7.4, 0.0, 0.0);
  619.     draw_part(5);
  620.     glTranslatef(6.8, 0.0, 0.0);
  621.     draw_part(6);
  622. }
  623.